<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.js" type="application/javascript">
    </script>

</head>

<body>

    <div id="app">

        <cp1 a="1" b="2" t="3" v-if="showCp1" @child="getemit"></cp1>
        <button @click="showCp1=!showCp1">切换cp1组件的渲染</button>
        <!-- <button @click="showCp2=!showCp2">切换cp2组件的渲染</button> -->
        <!-- <button @click="bye()">切换cp2组件的渲染</button> -->
    </div>
    <script>
        Vue.component('cp1', {
            // props:['a','t'],
            template: `
                <div>
                    <div> 我是cp1组件 </div>
                    <button @click="showself"> 查看组件实例自身 </button>  
                    <hr />
                    <div> ct: {{ ct }}</div>
                    <button @click="ct++"> ct递增 </button>
                    <button @click="takeFatherVal"> 给父组件传值 </button>
                </div>    
            `,
            data() {
                return {
                    k: 1,
                    f: 2,
                    c: 3,
                    ct: 100,
                    timer: null,
                    sonVal:"你滴儿子数据"
                }
            },
            // 挂载阶段
            // before 在什么之前  create创建
            beforeCreate() {
                console.log('子组件的--------beforeCreate执行, 创建完成之前')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
            },

            created() { // 创建完成 到底创建了什么？ 完成了组件的实例的创建但是并没有挂载到网页当中
                console.log('子组件的--------created 执行, 创建完成之后')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
            },
            // mount 挂载 （ vue把组件 具体的渲染到了页面当中 ）
            beforeMount() {
                console.log('子组件的--------beforeMount 执行 , 挂载之前')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
            },
            mounted() { // 挂载完成之后  一般如果需要进行节点的操作的话都必须在 mounted之后执行
                console.log('子组件的--------mounted 执行, 挂载之后')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
                // this.timer = setInterval(()=>{
                //     console.log(Date.now())
                // },1000)
            },
            // 更新阶段
            beforeUpdate() {
                console.log('子组件的--------beforeUpdate, 更新之前')
            },

            updated() {
                console.log('子组件的--------updated, 更新之后')
            },
            // 卸载阶段
            // destroy 销毁 摧毁
            beforeDestroy() {
                // 事件的解绑 和 定时器移除的最佳时机
                console.log('子组件的--------beforeDestroy, 销毁之前')
                // clearInterval(this.timer)
            },
            destroyed() {
                console.log('子组件的--------destroyed, 销毁之后')
            },
            methods: {
                showself() {
                    console.log('this', this)
                    // this.$el  得到的组件挂载的跟节点标签对象
                    // this.$data 就是 组件内部的配置的 data返回的对象
                    // this.$attrs 得到除了 props声明接收的属性以外的 组件上的自定义属性

                },
                takeFatherVal(){
                    this.$emit('child', this.ct);
                }
            }


        })


        new Vue({
            el: '#app',
            data: {
                ct: '555',
                showCp1: true,
                showCp2: true
            },
            methods: {
                fn1(res) {
                    console.log('我是 根实例的 fn1', res)
                },
                getemit(val){
                    console.log("父组件接收到了数据",val)
                }
                // bye() {
                //     console.log('bye')
                //     this.$destroyed()
                // }
            },
            // 挂载阶段
            // before 在什么之前  create创建
            beforeCreate() {
                console.log('父组件的++++++++beforeCreate执行, 创建完成之前')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
            },

            created() { // 创建完成 到底创建了什么？ 完成了组件的实例的创建但是并没有挂载到网页当中
                console.log('父组件的++++++++created 执行, 创建完成之后')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
            },
            // mount ,  （ vue把组件 具体的渲染到了页面当中 ）
            beforeMount() {
                console.log('父组件的++++++++beforeMount 执行, 挂载之前')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
            },
            mounted() { // 挂载完成之后  一般如果需要进行节点的操作的话都必须在 mounted之后执行
                console.log('父组件的++++++++mounted 执行, 挂载之后')
                // console.log('this.$el',this.$el)
                // console.log('this.$data',this.$data)
                // this.timer = setInterval(()=>{
                //     console.log(Date.now())
                // },1000)
            },
            // 更新阶段
            beforeUpdate() {
                console.log('父组件的++++++++beforeUpdate, 更新之前')
            },

            updated() {
                console.log('父组件的++++++++updated, 更新之后')
            },
            // 卸载阶段
            // destroy 销毁 摧毁
            beforeDestroy() {
                // 事件的解绑 和 定时器移除的最佳时机
                console.log('父组件的++++++++beforeDestroy, 销毁之前')
                // clearInterval(this.timer)
            },
            destroyed() {
                console.log('父组件的++++++++destroyed, 销毁了')
            },
        })
    </script>


</body>

</html>